Merge branch 'master' of git://repo.or.cz/mqlkit
[mqlkit.git] / indicators / J4Bollinger Bands.mq4
bloba0447ce9d8bdaea2e9b8d172258ee622fd5a6b1d
1 /*\r
2 Äëÿ  ðàáîòû  èíäèêàòîðà  ñëåäóåò  ïîëîæèòü ôàéëû \r
3 JJMASeries.mqh \r
4 PriceSeries.mqh \r
5 â ïàïêó (äèðåêòîðèþ): MetaTrader\experts\include\\r
6 Heiken Ashi#.mq4\r
7 â ïàïêó (äèðåêòîðèþ): MetaTrader\indicators\\r
8 */\r
9 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
10 //|                                            J4Bollinger Bands.mq4 | \r
11 //|                        Copyright © 2006,        Nikolay Kositsin | \r
12 //|                              Khabarovsk,   farria@mail.redcom.ru | \r
13 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
14 #property copyright "Nikolay Kositsin"\r
15 #property link "farria@mail.redcom.ru" \r
16 //---- îòðèñîâêà èíäèêàòîðà â ãëàâíîì îêíå\r
17 #property indicator_chart_window \r
18 //---- êîëè÷åñòâî èíäèêàòîðíûõ áóôôåðîâ\r
19 #property indicator_buffers 5\r
20 //---- öâåòà èíäèêàòîðà\r
21 #property indicator_color1 Red\r
22 #property indicator_color2 Blue \r
23 #property indicator_color3 Lime\r
24 #property indicator_color4 Blue\r
25 #property indicator_color5 Red\r
26 //---- ñòèëü ëèíèé èíäèêàòîðà\r
27 #property indicator_style1 4\r
28 #property indicator_style2 2\r
29 #property indicator_style3 4\r
30 #property indicator_style4 2\r
31 #property indicator_style5 4\r
32 //---- ÂÕÎÄÍÛÅ ÏÀÐÀÌÅÒÐÛ ÈÍÄÈÊÀÒÎÐÀ þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþþææ+\r
33 extern int        Bands_Period = 100; // ïåðèîä  óñðåäíåíèÿ J2Bollinger Bands\r
34 extern double Bands_Deviations = 2.0; // äåâèàòàöèÿ \r
35 extern int           MA_method = 0;   // ìåòîä óñðåäíåíèÿ\r
36 extern int           MA_Smooth = 20;  // ãëóáèíà ñãëàæèâàíèÿ ïîëó÷åííîãî Moving Avereges\r
37 extern int        Bands_Smooth = 20;  // ãëóáèíà ñãëàæèâàíèÿ ïîëó÷åííûõ Bollinger Bands\r
38 extern int        Smooth_Phase = 100; // ïàðàìåòð ñãëàæèâàíèÿ, èçìåíÿþùèéñÿ â ïðåäåëàõ -100 ... +100, âëèÿåò íà êà÷åñòâî ïåðåõîäíîãî ïðîöåññà; \r
39 extern int          Bands_Shift = 0;  // cäâèã èíäèêàòîðà âäîëü îñè âðåìåíè \r
40 extern int  Input_Price_Customs = 0;  //Âûáîð öåí, ïî êîòîðûì ïðîèçâîäèòñÿ ðàñ÷¸ò èíäèêàòîðà \r
41 //(0-CLOSE, 1-OPEN, 2-HIGH, 3-LOW, 4-MEDIAN, 5-TYPICAL, 6-WEIGHTED, 7-Heiken Ashi Close, 8-SIMPL, 9-TRENDFOLLOW, 10-0.5*TRENDFOLLOW,\r
42 //11-Heiken Ashi Low, 12-Heiken Ashi High,  13-Heiken Ashi Open, 14-Heiken Ashi Close.)\r
43 //---- æææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææææ+\r
44 //---- èíäèêàòîðíûå áóôôåðû\r
45 double UpperBuffer2 [];\r
46 double UpperBuffer1 [];\r
47 double JMovingBuffer[];\r
48 double LowerBuffer1 [];\r
49 double LowerBuffer2 [];\r
50 double Series_buffer[];\r
51 //---- ïåðåìåííûå ñ ïëàâàþùåé òî÷êîé  \r
52 double deviation1,deviation2,Temp_Series,sum,midline,priceswing,Resalt;\r
53 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
54 //| J4Bollinger Bands initialization function                        | \r
55 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
56 int init()\r
57   {\r
58 //---- îïðåäåëåíèå ñòèëÿ èñïîëíåíèÿ ãðàôèêà\r
59    SetIndexStyle(0,DRAW_LINE); \r
60    SetIndexStyle(1,DRAW_LINE);\r
61    SetIndexStyle(2,DRAW_LINE);\r
62    SetIndexStyle(3,DRAW_LINE); \r
63    SetIndexStyle(4,DRAW_LINE);\r
64 //---- 4 èíäèêàòîðíûõ áóôôåðà èñïîëüçîâàíû äëÿ ñ÷¸òà.  \r
65    IndicatorBuffers(6);\r
66    SetIndexBuffer(0,UpperBuffer2 );\r
67    SetIndexBuffer(1,UpperBuffer1 );\r
68    SetIndexBuffer(2,JMovingBuffer);\r
69    SetIndexBuffer(3,LowerBuffer1 );\r
70    SetIndexBuffer(4,LowerBuffer2 );\r
71    SetIndexBuffer(5,Series_buffer);\r
72 //---- óñòàíîâêà çíà÷åíèé èíäèêàòîðà, êîòîðûå íå áóäóò âèäèìû íà ãðàôèêå\r
73    SetIndexEmptyValue(0,0);\r
74    SetIndexEmptyValue(1,0);\r
75    SetIndexEmptyValue(2,0);\r
76    SetIndexEmptyValue(3,0);\r
77    SetIndexEmptyValue(4,0);\r
78 //---- óñòàíîâêà íîìåðà áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò îòðèñîâûâàòüñÿ èíäèêàòîð  \r
79    int drawbegin=Bands_Period+30+Bands_Shift;\r
80    SetIndexDrawBegin(0,drawbegin);\r
81    SetIndexDrawBegin(1,drawbegin);\r
82    SetIndexDrawBegin(2,drawbegin);\r
83    SetIndexDrawBegin(3,drawbegin);\r
84    SetIndexDrawBegin(4,drawbegin);\r
85 //---- ãîðèçîíòàëüíûé ñäâèã èíäèêàòîðíûõ ëèíèé  \r
86    SetIndexShift (0, Bands_Shift); \r
87    SetIndexShift (1, Bands_Shift); \r
88    SetIndexShift (2, Bands_Shift); \r
89    SetIndexShift (3, Bands_Shift); \r
90    SetIndexShift (4, Bands_Shift); \r
91 //---- èìÿ äëÿ îêîí äàííûõ è ëýéáà äëÿ ñóáúîêîí.\r
92    IndicatorShortName ("J4Bollinger Bands( Period="+Bands_Period+", Deviations="+Bands_Deviations+")"); \r
93    SetIndexLabel (0, "Upper2 Bands");\r
94    SetIndexLabel (1, "Upper1 Bands"); \r
95    SetIndexLabel (3, "Lower1 Bands"); \r
96    SetIndexLabel (4, "Lower2 Bands"); \r
97    switch(MA_method)\r
98            {\r
99             case  0: SetIndexLabel (2, "JMoving Avereges JSMA ("+Bands_Period+")");break;\r
100             case  1: SetIndexLabel (2, "JMoving Avereges JEMA ("+Bands_Period+")");break;\r
101             case  2: SetIndexLabel (2, "JMoving Avereges JSSMA("+Bands_Period+")");break;\r
102             case  3: SetIndexLabel (2, "JMoving Avereges JLWMA("+Bands_Period+")");break;\r
103             default: SetIndexLabel (2, "JMoving Avereges JSMA ("+Bands_Period+")");\r
104            }\r
105 //----\r
106    IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));\r
107 //---- óñòàíîâêà àëåðòîâ íà íåäîïóñòèìûå çíà÷åíèÿ âõîäíûõ ïàðàìåòðîâ ======================================================================================+ \r
108 if(Smooth_Phase<-100){Alert("Ïàðàìåòð Smooth_Phase äîëæåí áûòü îò -100 äî +100" + " Âû ââåëè íåäîïóñòèìîå " +Smooth_Phase+  " áóäåò èñïîëüçîâàíî -100");}//|\r
109 if(Smooth_Phase> 100){Alert("Ïàðàìåòð Smooth_Phase äîëæåí áûòü îò -100 äî +100" + " Âû ââåëè íåäîïóñòèìîå " +Smooth_Phase+  " áóäåò èñïîëüçîâàíî  100");}//|\r
110 if(MA_Smooth<1)      {Alert("Ïàðàìåòð MA_Smooth äîëæåí áûòü íå ìåíåå 1" + " Âû ââåëè íåäîïóñòèìîå " +MA_Smooth+ " áóäåò èñïîëüçîâàíî  1");}////////////////|\r
111 if(MA_Smooth<1)      {Alert("Ïàðàìåòð Bands_Smooth äîëæåí áûòü íå ìåíåå 1" + " Âû ââåëè íåäîïóñòèìîå " +Bands_Smooth + " áóäåò èñïîëüçîâàíî  1");}/////////|\r
112 if(Bands_Period<1)   {Alert("Ïàðàìåòð Bands_Period äîëæåí áûòü íå ìåíåå 1 "+ " Âû ââåëè íåäîïóñòèìîå " +Bands_Period+ " áóäåò èñïîëüçîâàíî  1");}//////////|\r
113 if(MA_method<0)      {Alert("Ïàðàìåòð MA_method äîëæåí áûòü îò 0 äî 3"   + " Âû ââåëè íåäîïóñòèìîå " +MA_method+ " áóäåò èñïîëüçîâàíî 0");}////////////////|\r
114 if(MA_method>3)      {Alert("Ïàðàìåòð MA_method äîëæåí áûòü îò 0 äî 3"   + " Âû ââåëè íåäîïóñòèìîå " +MA_method+ " áóäåò èñïîëüçîâàíî 0");}////////////////|\r
115 PriceSeriesAlert(Input_Price_Customs);/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////|\r
116 //+========================================================================================================================================================+ \r
117 //---- êîðåêöèÿ íåäîïóñòèìîãî çíà÷åíèÿ ïàðàìåòðà Bands_Period\r
118 if (Bands_Period<1)Bands_Period=1; \r
119 //---- çàâåðøåíèå èíèöèàëèçàöèè\r
120    return(0);\r
121   }\r
122 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
123 //| J4Bollinger Bands iteration function                             | \r
124 //+SSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSS+ \r
125 int start()\r
126   {\r
127 //---- ïðîâåðêà êîëè÷åñòâà áàðîâ íà äîñòàòî÷íîñòü äëÿ ðàñ÷¸òà\r
128 if(Bars-1<=Bands_Period) return(0);\r
129 //----+ Ââåäåíèå öåëûõ ïåðåìåííûõ è ïîëó÷åíèå óæå ïîäñ÷èòàííûõ áàðîâ\r
130 //---- áëîêèðîâàíèå ïåðåñ÷¸òà âñåõ ïîäñ÷èòàííûõ è îòðèñîâàííûõ áàðîâ ïðè ïîäêëþ÷åíèè ê èíòåðíåòó\r
131 int reset,MaxBar,MaxBarBB,bar,kk,counted_bars=INDICATOR_COUNTED(0); INDICATOR_COUNTED(1);\r
132 //---- ïðîâåðêà íà âîçìîæíûå îøèáêè\r
133 if (counted_bars<0){INDICATOR_COUNTED(-1);return(-1);}\r
134 //---- ïîñëåäíèé ïîäñ÷èòàííûé áàð äîëæåí áûòü ïåðåñ÷èòàí \r
135 //---- (áåç ýòîãî ïåðåñ÷¸òà äëÿ counted_bars ôóíêöèÿ JJMASeries áóäåò ðàáîòàòü íåêîððåêòíî!!!)\r
136 if (counted_bars>0) counted_bars--;\r
137 //----+ Ââåäåíèå è èíèöèàëèçàöèÿ âíóòðåííèõ ïåðåìåííûõ ôóíêöèè JJMASeries, nJMAnumber=5(Ïÿòü îáðàùåíèé ê ôóíêöèè)  \r
138 if (counted_bars==0)if (Bands_Smooth>1)JJMASeriesReset(5);else JJMASeriesReset(1);\r
139 //---- îïðåäåëåíèå íîìåðà ñàìîãî ñòàðîãî áàðà, íà÷èíàÿ ñ êîòîðîãî áóäåò ïðîèçåä¸í ïåðåñ÷¸ò íîâûõ áàðîâ\r
140 int limit=Bars-counted_bars-1;MaxBar=Bars-1-Bands_Period;MaxBarBB=MaxBar-30-Bands_Period;\r
141 //----+ çàãðóçêà âõîäíûõ öåí â áóôôåð äëÿ ðàñ÷¸òà       \r
142 for(bar=limit;bar>=0;bar--)Series_buffer[bar]=PriceSeries(Input_Price_Customs,bar);\r
143 //---- ïðîâåðêà áàðà íà äîñòàòî÷íîñòü äëÿ ðàñ÷¸òà Bollinger Bands \r
144 //---- èíèöèàëèçàöèÿ íóëÿ          \r
145 if (limit>MaxBar)\r
146      {\r
147       for(bar=limit;bar>=MaxBar;bar--)JMovingBuffer[bar]=0;\r
148       limit=MaxBar;\r
149      }\r
150 //----+ öèêë ðàñ÷¸òà Moving Avereges\r
151 for(bar=limit;bar>=0;bar--)\r
152      {\r
153       //----+ ôîðìóëà äëÿ ðàñ÷¸òà Moving Avereges\r
154       switch(MA_method)\r
155            {\r
156             case  0: Temp_Series=iMAOnArray(Series_buffer,0,Bands_Period,0,MODE_SMA, bar);break;\r
157             case  1: Temp_Series=iMAOnArray(Series_buffer,0,Bands_Period,0,MODE_EMA, bar);break;\r
158             case  2: Temp_Series=iMAOnArray(Series_buffer,0,Bands_Period,0,MODE_SMMA,bar);break;\r
159             case  3: Temp_Series=iMAOnArray(Series_buffer,0,Bands_Period,0,MODE_LWMA,bar);break;\r
160             default: Temp_Series=iMAOnArray(Series_buffer,0,Bands_Period,0,MODE_SMA, bar);\r
161            }\r
162       //----+ ñãëàæèâàíèå ïîëó÷åííîãî Moving Avereges\r
163       //----+ îáðàùåíèå ê ôóíêöèè JJMASeries çà íîìåðîì 0. Ïàðàìåòðû nJMAPhase è nJMALength íå ìåíÿþòñÿ íà êàæäîì áàðå (nJMAdin=0)\r
164       Resalt=JJMASeries(0,0,MaxBar,limit,Smooth_Phase,MA_Smooth,Temp_Series,bar,reset);\r
165       //----+ ïðîâåðêà íà îòñóòñòâèå îøèáêè â ïðåäûäóùåé îïåðàöèè\r
166       if(reset!=0){INDICATOR_COUNTED(-1);return(-1);} \r
167       JMovingBuffer[bar]=Resalt; \r
168      }     \r
169 //---- ÐÀÑרҠBollinger Bands \r
170 //---- èíèöèàëèçàöèÿ íóëÿ      \r
171 if (limit>MaxBarBB)\r
172      {\r
173       for(bar=limit;bar>=MaxBarBB;bar--)\r
174        {\r
175         UpperBuffer2[bar]=0;\r
176         UpperBuffer1[bar]=0;\r
177         LowerBuffer1[bar]=0;\r
178         LowerBuffer2[bar]=0;\r
179        }\r
180       limit=MaxBarBB;\r
181      }\r
182 for(bar=limit;bar>=0;bar--)\r
183    {         \r
184      sum=0.0;\r
185      midline=JMovingBuffer[bar];\r
186      kk=bar+Bands_Period-1;\r
187      while(kk>=bar)\r
188       {\r
189        priceswing=PriceSeries(Input_Price_Customs,kk)-midline;\r
190        sum+=priceswing*priceswing;\r
191        kk--;\r
192       }\r
193      deviation2=Bands_Deviations*MathSqrt(sum/Bands_Period);     \r
194      deviation1=0.5*deviation2;\r
195      if (Bands_Smooth>1)\r
196         {\r
197          //----+ âû÷èñëåíèå è JMA ñãëàæèâàíèå Bollinger Bands      \r
198          //----+ ----------------------------------------------------------------------------------------+            \r
199          //----+ ÷åòûðå ïàðàëëåëüíûõ îáðàùåíèÿ ê ôóíêöèè JJMASeries çà íîìåðàìè 1, 2, 3, 4. \r
200          //----+ Ïàðàìåòðû nJJMALength íå ìåíÿtòñÿ íà êàæäîì áàðå (nJJMAdin=0)\r
201          //----+ ----------------------------------------------------------------------------------------+ \r
202          Resalt=JJMASeries(1,0,MaxBarBB-1,limit,Smooth_Phase,Bands_Smooth ,midline+deviation2,bar,reset);\r
203          //----+ ïðîâåðêà íà îòñóòñòâèå îøèáêè â ïðåäûäóùåé îïåðàöèè\r
204          if(reset!=0){INDICATOR_COUNTED(-1);return(-1);} \r
205          UpperBuffer2[bar]=Resalt; \r
206          //----+ ----------------------------------------------------------------------------------------+       \r
207          Resalt=JJMASeries(2,0,MaxBarBB-1,limit,Smooth_Phase,Bands_Smooth ,midline+deviation1,bar,reset);\r
208          //----+ ïðîâåðêà íà îòñóòñòâèå îøèáêè â ïðåäûäóùåé îïåðàöèè\r
209          if(reset!=0){INDICATOR_COUNTED(-1);return(-1);} \r
210          UpperBuffer1[bar]=Resalt; \r
211          //----+ ----------------------------------------------------------------------------------------+ \r
212          Resalt=JJMASeries(3,0,MaxBarBB-1,limit,Smooth_Phase,Bands_Smooth ,midline-deviation1,bar,reset);\r
213          //----+ ïðîâåðêà íà îòñóòñòâèå îøèáêè â ïðåäûäóùåé îïåðàöèè\r
214          if(reset!=0){INDICATOR_COUNTED(-1);return(-1);} \r
215          LowerBuffer1[bar]=Resalt; \r
216          //----+ ----------------------------------------------------------------------------------------+ \r
217          Resalt=JJMASeries(4,0,MaxBarBB-1,limit,Smooth_Phase,Bands_Smooth ,midline-deviation2,bar,reset);\r
218          //----+ ïðîâåðêà íà îòñóòñòâèå îøèáêè â ïðåäûäóùåé îïåðàöèè\r
219          if(reset!=0){INDICATOR_COUNTED(-1);return(-1);} \r
220          LowerBuffer2[bar]=Resalt;         \r
221          //----+ ----------------------------------------------------------------------------------------+ \r
222         }\r
223       else \r
224         {\r
225          //----+ âû÷èñëåíèå Bollinger Bands áåç JMA ñãëàæèâàíèÿ  \r
226          UpperBuffer2[bar]=midline+deviation2;\r
227          UpperBuffer1[bar]=midline+deviation1;\r
228          LowerBuffer1[bar]=midline-deviation1;\r
229          LowerBuffer2[bar]=midline-deviation2;\r
230         }\r
231       \r
232    }\r
233 //---- çàâåðøåíèå âû÷èñëåíèé çíà÷åíèé èíäèêàòîðà\r
234    return(0);\r
235   }\r
236 //+---------------------------------------------------------------------------------------------------------------------------+\r
237 //----+ Ââåäåíèå ôóíêöèè JJMASeries (ôàéë JJMASeries.mqh ñëåäóåò ïîëîæèòü â ïàïêó (äèðåêòîðèþ): MetaTrader\experts\include)\r
238 //----+ Ââåäåíèå ôóíêöèè JJMASeriesReset  (äîïîëíèòåëüíàÿ ôóíêöèÿ ôàéëà JJMASeries.mqh)\r
239 //----+ Ââåäåíèå ôóíêöèè INDICATOR_COUNTED(äîïîëíèòåëüíàÿ ôóíêöèÿ ôàéëà JJMASeries.mqh)\r
240 #include <JJMASeries.mqh> \r
241 //+---------------------------------------------------------------------------------------------------------------------------+\r
242 //----+ Ââåäåíèå ôóíêöèè PriceSeries, ôàéë PriceSeries.mqh ñëåäóåò ïîëîæèòü â ïàïêó (äèðåêòîðèþ): MetaTrader\experts\include\r
243 //----+ Ââåäåíèå ôóíêöèè PriceSeriesAlert (äîïîëíèòåëüíàÿ ôóíêöèÿ ôàéëà PriceSeries.mqh)\r
244 #include <PriceSeries.mqh>\r
245 //+---------------------------------------------------------------------------------------------------------------------------+